import { Logger } from 'log4js'

// 日志记录器类，设置为单例模式
// 可以注入多个日志记录器
// 用于记录不同类型的日志
// 暂时用不到，设计还没想好，可能有需要的场景
export default class ExpressLogger {
  // 日志记录器数组
  private loggers: Logger[]
  // 上下文
  private context: Record<string, any>
  // 单例模式
  private static instance: ExpressLogger

  // 构造函数
  private constructor(loggers: Logger[] = []) {
    this.loggers = loggers
    this.context = {}
  }

  // 获取单例实例
  public static getInstance(): ExpressLogger {
    if (!ExpressLogger.instance) {
      ExpressLogger.instance = new ExpressLogger()
    }
    return ExpressLogger.instance
  }

  // 设置日志记录器
  setLoggers(loggers: Logger[]) {
    this.loggers = loggers
    return this
  }

  // 新增日志记录器
  addLogger(logger: Logger) {
    this.loggers.push(logger)
    return this
  }

  // 移除日志记录器
  removeLogger(logger: Logger) {
    const index = this.loggers.indexOf(logger)
    if (index !== -1) {
      this.loggers.splice(index, 1)
    }
    return this
  }

  // 设置上下文
  addContext<T extends any>(key: string, value: T) {
    this.context[key] = value
    // 为每个日志记录器添加上下文
    this.loggers.forEach(logger => {
      logger.addContext(key, value)
    })
    return this
  }

  // 获取上下文
  getContext<T extends any>(key: string): T {
    return this.context[key]
  }

  // 删除上下文
  removeContext(key: string) {
    delete this.context[key]
    return this
  }

  // 清除上下文
  clearContext() {
    this.context = {}
    return this
  }

  // 记录日志
  log(level: string, message: string, ...args: any[]) {
    this.loggers.forEach(logger => {
      if (logger.isLevelEnabled(level)) {
        logger.log(level, message, ...args)
      }
    })
  }

  // 记录 trace 日志
  trace(message: string, ...args: any[]) {
    this.log('trace', message, ...args)
  }

  // 记录 debug 日志
  debug(message: string, ...args: any[]) {
    this.log('debug', message, ...args)
  }

  // 记录 info 日志
  info(message: any, ...args: any[]) {
    this.log('info', message, ...args)
  }
  // 记录 warn 日志
  warn(message: any, ...args: any[]) {
    this.log('warn', message, ...args)
  }
  // 记录 error 日志
  error(message: any, ...args: any[]) {
    this.log('error', message, ...args)
  }
  // 记录 fatal 日志
  fatal(message: any, ...args: any[]) {
    this.log('fatal', message, ...args)
  }
  // 记录 mark 日志
  mark(message: any, ...args: any[]) {
    this.log('mark', message, ...args)
  }
}
